package com.ia2014.tp.portal2.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.ia2014.tp.portal2.facades.FacadeIntegracion;
import com.ia2014.tp.portal2.util.DateUtils;
import com.ia2014.tp.portal2.vo.ArticuloVO;

@WebServlet("/findArticulos")
public class FindArticulosServlet extends AbstractServlet{
	private static final long serialVersionUID = 5912397760551010545L;
	private static final int NOMBRE_ARTICULO 	= 1;
	private static final int CODIGO_ARTICULO 	= 2;
	private static final int FECHA_ARTICULO 	= 3;
	private static final int CATEGORIA_ARTICULO = 4;	
	private static final int PRECIO_ARTICULO 	= 5;
	
	@EJB
	private FacadeIntegracion facade;
	
	
	public FindArticulosServlet(){
		super();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doGet(req, resp);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.comprobarSession(req, resp);
		this.process(req, resp);
	}

	
	private void process(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException{
		//Levanto la session y saco los parametros de configuracion
		HttpSession session  = req.getSession(false);
		String redirect = "portal.jsp";
		List <ArticuloVO> articulosVO = null;
		ArticuloVO articuloVO = null;
		
		String tipoBusqueda = req.getParameter("tipoBusqueda");
		int iTipoBusqueda = 0;
		try {
			iTipoBusqueda = Integer.parseInt(tipoBusqueda);
		} catch (NumberFormatException e) {
			iTipoBusqueda = 0;
		}
		
		switch(iTipoBusqueda){
			case NOMBRE_ARTICULO:
				String nombreArticulo = req.getParameter("nombreArticulo");
				//Verifico parámetros. Si viene el nombre, busco por nombre
				if (nombreArticulo != null && !nombreArticulo.isEmpty()){
					articulosVO = this.facade.getListaArticulosByNombre(nombreArticulo.trim());
					if (articulosVO == null){
						articulosVO = this.createEmptyList();
					}
				}
				//no vino el paráemtro, busca todos los artículos disponibles
				else{
					articulosVO = this.allArticulosVO();
				}
				break;
			
			case CODIGO_ARTICULO:
				String codigoArticulo = req.getParameter("codigoArticulo");
				//Verifico que venga informado
				if (codigoArticulo != null && !codigoArticulo.trim().isEmpty()){
					try {
						Integer iCodigo = Integer.parseInt(codigoArticulo);
						articuloVO = this.facade.getArticuloByCodigo(iCodigo);
						articulosVO = this.createEmptyList();
						if (articuloVO != null){
							articulosVO.add(articuloVO);
						}
					} catch (NumberFormatException e) {
						articulosVO = this.createEmptyList();
					}
				}
				break;
			
			case FECHA_ARTICULO:
				String fechaHasta = req.getParameter("fechaHasta");
				Date dateHasta = new Date();
				if (fechaHasta != null && !fechaHasta.trim().isEmpty()){
					dateHasta = DateUtils.getDateFromString(fechaHasta, "yyyy-MM-dd");
				}
				
				String fechaDesde = req.getParameter("fechaDesde");
				Date dateDesde = new Date();
				if (fechaDesde != null && !fechaDesde.trim().isEmpty()){
					dateDesde = DateUtils.getDateFromString(fechaDesde, "yyyy-MM-dd");
				}
				
				articulosVO = this.facade.getListaArticulosByFechasDesdeHasta(dateDesde, dateHasta);
				if (articulosVO == null){
					articulosVO = this.createEmptyList();
				}
				break;
			
			case CATEGORIA_ARTICULO:
				String categoria = req.getParameter("categoria");
				if (categoria != null && !categoria.isEmpty()){
					articulosVO = this.facade.getListaArticulosByCategoria(categoria);
					if (articulosVO == null){
						articulosVO = this.createEmptyList();
					}
				}
				break;
			
			case PRECIO_ARTICULO:
				String sPrecioDesde = req.getParameter("precioDesde");
				String sPrecioHasta = req.getParameter("precioHasta");
				
				Double precioDesde = 0.0;
				Double precioHasta = 0.0;
				
				if (sPrecioDesde != null && !sPrecioDesde.trim().isEmpty()){
					try {
						precioDesde = Double.parseDouble(sPrecioDesde);
					} catch (NumberFormatException e) {
						precioDesde = 0.0;
					}
				}
				
				if (sPrecioHasta != null && !sPrecioHasta.trim().isEmpty()){
					try {
						precioHasta = Double.parseDouble(sPrecioHasta);
					} catch (NumberFormatException e) {
						precioHasta = 0.0;
					}
				}				
				
				articulosVO = this.facade.getListaArticulosByPrecioDesdeHasta(precioDesde, precioHasta);
				if (articulosVO == null){
					articulosVO = this.createEmptyList();
				}
				
				break;
			
			default:
				articulosVO = this.allArticulosVO();
				break;
		}

		
		this.setListArticulosToSession(session, articulosVO);
		resp.sendRedirect(redirect);
	}	
	
	private List <ArticuloVO> createEmptyList(){
		return new ArrayList <ArticuloVO>();
	}
	
	private List <ArticuloVO> allArticulosVO(){
		List <ArticuloVO> articulos = this.facade.getListaArticulos();
		if (articulos == null){
			articulos = new ArrayList <ArticuloVO>();
		}
		
		return articulos;
	}
	
}
